package educar.models;


import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;


public class Cursa {	
	private Student alumno;
	private Materia materia;
	private static JPA jpa= new JPA();
	
	/**
	 * metodo constructor de la clase
	 * @param newAlumno
	 * @param newMateria
	 */
	public Cursa(Student newAlumno, Materia newMateria) {
		setMateria(newMateria);
		setStudent(newAlumno);
	}
	
	/**
	 * Permite guardar en la base de datos
	 * @return si pudo realizar la operacion
	 */
	public boolean save() {
		try {
			Cursa.getCursaByStudentAndMateria(alumno.getDni(),materia.getCodigo());
			return false;
		} catch (cursaNotFound e1) {
			String[] columns = { "dni","cod_materia" };
			PreparedStatement stm = jpa.newRecord("cursa", columns);
			try {
				stm.setString(1, alumno.getDni());
				stm.setString(2, materia.getCodigo());
			} catch (SQLException e) {
				e.printStackTrace();
				return false;
			}
			jpa.create(stm);
			return true;
		}
	}

	

	/**
	 * permite borrar un cursa de la base de datos
	 */
	public void destroy() {
		try {
			String[] columns = {"dni", "cod_materia" };
			String[] id = {alumno.getDni(), materia.getCodigo()};
			jpa.destroy("cursa", columns, id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	
	/**
	 *  retorna un objeto cursa dado el dni del alumno y el codigo de materia
	 * @param dni del alumno
	 * @param cod_materia de la materia
	 * @return Cursa objeto con la relacion
	 * @throws cursaNotFound si el alumno no cursa la materia
	 */
	public static Cursa getCursaByStudentAndMateria(String dni,String cod_materia) throws cursaNotFound{
		ResultSet rs = null;
		Cursa c = null;
		String[] columnas = {"dni","cod_materia"};
		String[] datos = {dni,cod_materia};
		rs = jpa.getByField("cursa",columnas, datos);
		try {
			if (rs.next()) {
				try {
					c = new Cursa(Student.getStudentByDni(rs.getString(1)), Materia.getMateriaByCodigo(rs.getString(2)));
				} catch (NumberFormatException e) {
					e.printStackTrace();
				} catch (materiaNotFound e) {
					e.printStackTrace();
				} catch (studentNotFound e) {
					e.printStackTrace();
				}
			} 
			else {
				throw new cursaNotFound();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return c;
	}
	
	
	/**
	 * retorna la materia que cursa el alumno
	 * @return Materia
	 */
	public Materia getMateria() {
		return materia;
	}
	
	/**
	 * permite establecer la materia que cursa el alumno
	 * @param materia
	 */
	public void setMateria(Materia materia) {
		this.materia = materia;
	}
	
	/**
	 * retorna el alumno que cursa la materia
	 * @return Student
	 */
	public Student getStudent() {
		return alumno;
	}
	
	/**
	 * permite establecer el alumno que cursa la materia
	 * @param alumno
	 */
	public void setStudent(Student alumno) {
		this.alumno = alumno;
	}
}
